import '../file_node.dart';
import 'fs_gateway.dart';
import 'path_resolver.dart';

/// [DeleteService]：用于删除文件或文件夹的服务类。
///
/// 功能：
/// - 负责解析逻辑路径到真实路径；
/// - 检查目标是否存在（若不存在直接返回失败）；
/// - 调用 [FileSystemGateway] 执行实际的删除操作；
/// - 删除完成后再次确认是否成功。
///
/// 架构说明：
/// - 与 [CreateService] 保持一致的结构；
/// - 对外暴露统一的 [delete] 方法；
/// - 内部依赖 [PathResolver] 和 [FileSystemGateway]，实现路径解析与文件系统交互。
///
/// 使用示例：
/// ```dart
/// final service = DeleteService(
///   pathResolver: PathResolver(),
///   fs: FileSystemGateway(),
/// );
///
/// final success = await service.delete(
///   '/projects/demo',
///   FileNode(name: 'old.dart', isFolder: false),
/// );
///
/// if (success) {
///   print('文件删除成功');
/// } else {
///   print('文件删除失败');
/// }
/// ```
class DeleteService {
  /// 路径解析器：负责将逻辑路径转换为真实路径。
  final PathResolver pathResolver;

  /// 文件系统网关：封装底层文件操作。
  final FileSystemGateway fs;

  DeleteService({required this.pathResolver, required this.fs});

  /// 删除文件或文件夹。
  ///
  /// - [logicalPath] 树状视图中的逻辑路径（例如 `/src/utils`）；
  /// - [node] 目标 [FileNode]（包含是否为文件夹的标识）；
  ///
  /// 返回值：
  /// - `true`：删除成功；
  /// - `false`：失败（路径为空、目标不存在或抛出异常）。
  ///
  /// 内部流程：
  /// 1. 通过 [PathResolver] 将逻辑路径解析为真实路径；
  /// 2. 检查目标是否存在（若不存在直接返回 `false`）；
  /// 3. 调用 [FileSystemGateway] 执行删除操作；
  /// 4. 删除完成后再次确认是否成功。
  ///
  /// 失败原因交由上层决定如何提示。
  Future<bool> delete(String logicalPath, FileNode node) async {
    try {
      // 1) 解析真实路径
      final realPath = pathResolver.resolve(logicalPath, node);
      if (realPath.isEmpty) return false;

      // 2) 检查是否存在
      final isFolder = node.isFolder;
      final exists = isFolder
          ? await fs.existsDir(realPath)
          : await fs.existsFile(realPath);
      if (!exists) return false;

      // 3) 删除并确认
      if (isFolder) {
        await fs.deleteDir(realPath, recursive: true);
        final still = await fs.existsDir(realPath);
        return !still;
      } else {
        await fs.deleteFile(realPath);
        final still = await fs.existsFile(realPath);
        return !still;
      }
    } catch (_) {
      return false;
    }
  }
}
